home *** CD-ROM | disk | FTP | other *** search
- static char SCONFail[] = "SCRIPT connect failed: ";
- static char SCONFail1[] = "SCRIPT disconnect failed: ";
-
- static struct cmds sconcmds[] = {
- "tcp", scriptconn, 0, 0, NULLCHAR,
- "telnet", scriptconn, 0, 0, NULLCHAR,
- #ifdef AX25
- "ax25", scriptconn, 0, 0, NULLCHAR,
- "connect", scriptconn, 0, 0, NULLCHAR,
- #endif
- NULLCHAR
- };
-
-
-
-
- /* open a network connection based upon information in the cc line.
- * m->user is set to the socket number.
- */
- static int
- scriptconn(argc,argv,p)
- int argc;
- char *argv[];
- void *p;
- {
- struct world *here;
- char sock[MAXSOCKSIZE];
- union sp sp;
- char ctype;
- struct iface *ifp;
- char digis[MAXDIGIS][AXALEN];
- char target[AXALEN];
- int ndigis;
-
- here = (struct world *)p;
- sp.p = sock;
- here->Error[0] = 0; /* null error string */
- ctype = tolower(*argv[0]);
- if (argc < 2) {
- sprintf (here->Error, "%sSyntax Error", SCONFail);
- return -1;
- }
-
- switch (ctype) {
- #ifdef AX25
- case 'a':
- case 'c': /* allow 'c' for 'connect' as well */
- if( ((ifp = if_lookup(argv[1])) == NULLIF) || (ifp->flags & HIDE_PORT)) {
- sprintf(here->Error, "%sUnknown port %s",SCONFail, argv[1]);
- return -1;
- }
- if(ifp->type != CL_AX25){
- sprintf(here->Error, "%sPort %s not usable for AX.25 connects",SCONFail, argv[1]);
- return -1;
- }
- if(setcall(target,argv[2]) == -1){
- sprintf(here->Error, "%sBad call %s",SCONFail, argv[2]);
- return -1;
- }
-
- /* If digipeaters are given, put them in the routing table */
- if(argc > 3) {
- ndigis = argc - 3;
- if(ndigis > MAXDIGIS) {
- sprintf (here->Error, "%sToo many digipeaters", SCONFail);
- return -1;
- }
- for(i=0;i<ndigis;i++) {
- if(setcall(digis[i],argv[i+3]) == -1) {
- sprintf(here->Error, "%sBad digipeater call %s",SCONFail, argv[i+3]);
- return -1;
- }
- }
- if(ax_add(target,AX_AUTO,digis,ndigis,ifp) == NULLAXR) {
- sprintf(here->Error, "%sAX25 route add failed", SCONFail);
- return -1;
- }
- }
-
- sp.ax->sax_family = AF_AX25;
- strncpy(sp.ax->iface,argv[1],ILEN); /* the interface name */
- setcall(sp.ax->ax25_addr,argv[2]); /* the remote callsign */
- if((here->user = socket(AF_AX25,SOCK_STREAM,0)) == -1) {
- sprintf (here->Error, "%sError allocating socket", SCONFail);
- return -1;
- }
- len = sizeof(*sp.ax);
- break;
- #endif
- default:
- sp.in->sin_family = AF_INET;
- if((sp.in->sin_addr.s_addr = resolve(argv[1])) == 0) {
- sprintf (here->Error, "%sHost Unknown", SCONFail);
- return -1;
- }
- /* get the optional port number */
- if(argc > 2)
- sp.in->sin_port = atoip(argv[2]);
- else
- sp.in->sin_port = IPPORT_TELNET;
- if((here->user = socket(AF_INET,SOCK_STREAM,0)) == -1) {
- sprintf (here->Error, "%sError allocating socket", SCONFail);
- return -1;
- }
- len = sizeof(*sp.in);
- }
-
- sockmode(here->user,SOCK_ASCII);
- if(connect(here->user,sp.p,len) == -1) {
- sprintf (here->Error, "SCRIPT connect failed: %s errno %d",
- sockerr(here->user),errno);
- close_s(here->user);
- return -1;
- }
- return here->user;
- }
-
-